package com.swak.threads.utilization.wait;

import java.util.concurrent.BlockingQueue;

import com.swak.threads.utilization.Wait;

/**
 * 50%: 
 * 
 * 与操作系统的调度时间有关，因为统计周期按照调度时间来刷新统计
 * 时间设置的过短会增加过多的系统调用时间
 * 
 * 如何让cpu运行在 50%；
 * 1. 这里的任务是检查是否有任务要执行 占50%
 * 2. 睡眠 50%
 * @author 618lf
 */
public class Level5 implements Wait {

	@Override
	public void waitFor(BlockingQueue<Runnable> taskQueue) throws InterruptedException {

		// 这种方式不是靠谱的
//		long count = 8000000;
//		while (!this.hasTask(taskQueue)) {
//			count--;
//			if(count<=0) {
//				break;
//			}
//		}
//		LockSupport.parkNanos(100);

		// 保证执行和睡眠都在10ms内；
		// 这里一定要设置为 10 （与操作系统的调度周期有关）
		long SleepMS = 10;

		// 执行 10ms
		long startMS = System.currentTimeMillis();
		while (!this.hasTask(taskQueue)) {
			long end = System.currentTimeMillis();
			if (end - startMS >= SleepMS) {
				break;
			}
		}

		// 睡眠10 ms
		Thread.sleep(SleepMS);
	}

	private boolean hasTask(BlockingQueue<Runnable> taskQueue) {
		try {
			return taskQueue.peek() != null;
		} catch (Exception e) {
			return false;
		}
	}
}
